home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / -archivi / -recent2 / gaplib.lha / GAPLib_Beta / utility / report.c next >
C/C++ Source or Header  |  1999-01-03  |  3KB  |  149 lines

  1. /*
  2.  * Report file generation utility code.
  3.  * See report.doc for more info.
  4.  *
  5.  * (C)1998-1999 Peter Bengtsson
  6.  *
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <GAP.h>
  13.  
  14. #include "report.h"
  15.  
  16. static const char * const exts[REPFILES] = {
  17.     "avg",
  18.     "med",
  19.     "typ",
  20.     "max",
  21.     "min",
  22.     "dev"
  23. };
  24.  
  25. static const char * const descs[REPFILES] = {
  26.     "Average",
  27.     "Median",
  28.     "TypeCount",
  29.     "Max",
  30.     "Min",
  31.     "StdDev"
  32. };
  33.  
  34. struct Report *MakeReport(char *);
  35. void DoReport(struct Report *,struct Population *,unsigned int);
  36. void EndReport(struct Report *rs);
  37.  
  38. struct Report *MakeReport(char *basename)
  39. {
  40. struct Report *rs;
  41. char    *buf;
  42. int i;
  43.  
  44. if(basename!=NULL) {
  45.     buf = malloc((strlen(basename)+8)*sizeof(char));
  46.     rs = malloc(sizeof(struct Report));
  47.     rs->basename = malloc((strlen(basename)+1)*sizeof(char));
  48.     strcpy(rs->basename,basename);
  49.  
  50.     if(rs!=NULL && rs->basename!=NULL && buf!=NULL) {
  51.         for(i=0;i!=REPFILES;i++) {
  52.             sprintf(buf,"%s.%s",basename,exts[i]);
  53.             if((rs->files[i]=fopen(buf,"wb"))==NULL) {
  54.                 while(--i>=0) {
  55.                     fclose(rs->files[i]);
  56.                 }
  57.                 free(rs->basename);
  58.                 free(rs);
  59.                 rs = NULL;
  60.                 fprintf(stderr,"MakeReport: Error opening files for writing.\n");
  61.             }
  62.             rs->used[i]=0;
  63.             fprintf(rs->files[i],"# Generation, %s\n",descs[i]);
  64.         }
  65.     } else {
  66.         if(rs!=NULL) {
  67.             if(rs->basename!=NULL) {
  68.                 free(rs->basename);
  69.             }
  70.             free(rs);
  71.             rs = NULL;
  72.         }
  73.         fprintf(stderr,"MakeReport: No free store (malloc() failed).\n");
  74.     }
  75. } else {
  76.     fprintf(stderr,"MakeReport: NULL basename.\n");
  77. }
  78.  
  79. if(buf!=NULL) {
  80.     free(buf);
  81. }
  82.  
  83. return(rs);
  84. }
  85.  
  86. void EndReport(struct Report *rs)
  87. {
  88. int i;
  89. char *buf=NULL;
  90.  
  91. if(rs!=NULL) {
  92.     buf=malloc((strlen(rs->basename)+8)*sizeof(char));
  93.     for(i=0;i!=REPFILES;i++) {
  94.         fclose(rs->files[i]);    /* fclose does an fflush. */
  95.         if(rs->used[i]==0 && buf!=NULL) {
  96.             sprintf(buf,"%s.%s",rs->basename,exts[i]);
  97.             remove(buf);
  98.         }
  99.     }
  100.     free(rs->basename);
  101.     free(rs);
  102. }
  103.  
  104. if(buf!=NULL) {
  105.     free(buf);
  106. } else {
  107.     fprintf(stderr,"EndReport: No free store, continuing.\n");
  108. }
  109.  
  110. }
  111.  
  112. void DoReport(struct Report *rs,struct Population *Pop,unsigned int flags)
  113. {
  114. int i,n;
  115. struct Popstat *stat;
  116.  
  117. if(rs!=NULL && Pop!=NULL && flags!=0) {
  118.     stat = &Pop->Stat;
  119.     for(i=0;i!=REPFILES;i++) {
  120.         n = flags&(1<<i);
  121.         if(n!=0) {
  122.             rs->used[i]=1;
  123.             switch(n) {
  124.             case    AVERAGE:
  125.                 fprintf(rs->files[i],"%ld %f\n",stat->Generation,stat->AverageFitness);
  126.             break;
  127.             case    MEDIAN:
  128.                 fprintf(rs->files[i],"%ld %f\n",stat->Generation,stat->MedianFitness);
  129.             break;
  130.             case    TYPECOUNT:
  131.                 fprintf(rs->files[i],"%ld %ld\n",stat->Generation,stat->TypeCount);
  132.             break;
  133.             case    MAX:
  134.                 fprintf(rs->files[i],"%ld %f\n",stat->Generation,stat->MaxFitness);
  135.             break;
  136.             case    MIN:
  137.                 fprintf(rs->files[i],"%ld %f\n",stat->Generation,stat->MinFitness);
  138.             break;
  139.             case    STDDEV:
  140.                 fprintf(rs->files[i],"%ld %f\n",stat->Generation,stat->StdDeviation);
  141.             break;
  142.             }
  143.         }
  144.     }
  145. }
  146.  
  147. }
  148.  
  149.